/* * Licensed Materials - Property of IBM * © Copyright IBM Corporation 2015. All Rights Reserved. */ package com.ibm.mil.readyapps.telco.hotspots; import android.location.Geocoder; import android.location.Location; import com.google.android.gms.maps.model.LatLng; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.util.List; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; public class HotSpotPresenterImpl implements HotSpotPresenter { private final HotSpotView view; private final HotSpotModel model; private List<HotSpot> hotSpots; public HotSpotPresenterImpl(HotSpotView view, HotSpotModel model) { this.view = view; this.model = model; } @Override public Observable<HotSpot> getOnlineHotSpots(Geocoder geocoder, Location location) { return model.getHotSpots(location) .timeout(5, TimeUnit.SECONDS) .compose(new HotSpotTransformer(geocoder, location)) .compose(cacheHotSpots()); } @Override public Observable<HotSpot> getOfflineHotSpots(String json, Geocoder geocoder, final Location location) { return Observable.just(json) .map(new Func1<String, List<HotSpot>>() { @Override public List<HotSpot> call(String s) { return new Gson().fromJson(s, new TypeToken<List<HotSpot>>() { }.getType()); } }) .flatMap(new Func1<List<HotSpot>, Observable<HotSpot>>() { @Override public Observable<HotSpot> call(List<HotSpot> hotSpots) { return model.getOfflineHotSpotLocations(location, hotSpots); } }) .compose(new HotSpotTransformer(geocoder, location)) .compose(cacheHotSpots()); } private Observable.Transformer<HotSpot, HotSpot> cacheHotSpots() { return new Observable.Transformer<HotSpot, HotSpot>() { @Override public Observable<HotSpot> call(Observable<HotSpot> observable) { return observable.toList() .doOnNext(new Action1<List<HotSpot>>() { @Override public void call(List<HotSpot> hotSpots) { HotSpotPresenterImpl.this.hotSpots = hotSpots; } }) .flatMap(new Func1<List<HotSpot>, Observable<HotSpot>>() { @Override public Observable<HotSpot> call(List<HotSpot> hotSpots) { return Observable.from(hotSpots); } }); } }; } @Override public void watchMarkerClick(Observable<LatLng> markerObservable) { markerObservable.subscribe(new Action1<LatLng>() { @Override public void call(LatLng latLng) { scanHotSpots(latLng).subscribe(new Action1<HotSpot>() { @Override public void call(HotSpot hotSpot) { view.showHotSpotDetails(hotSpot); } }); } }); } private Observable<HotSpot> scanHotSpots(final LatLng latLng) { return Observable.from(hotSpots) .filter(new Func1<HotSpot, Boolean>() { @Override public Boolean call(HotSpot hotSpot) { return hotSpot.getLatitude() == latLng.latitude && hotSpot.getLongitude() == latLng.longitude; } }).first(); } }